package concursos.controladores;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.el.ELResolver;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import concursos.interfaces.ConcursoService;
import concursos.interfaces.ConteudoService;
import concursos.interfaces.DisciplinaService;
import concursos.modelos.Concurso;
import concursos.modelos.Conteudo;
import concursos.modelos.Disciplina;
import concursos.modelos.Referencia;
import concursos.modelos.Usuario;

/**
 * ManagedBean responsável por manter uma Disciplina.
 * 
 * @author Felipe
 * @author Nayane
 * @author Rafael
 * 
 */
@ManagedBean
@SessionScoped
public class CadastrarDisciplinaMB implements Serializable {

	private static final long serialVersionUID = -3932868319080782703L;

	@EJB
	private DisciplinaService beanDisciplina;
	@EJB
	private ConcursoService beanConcurso;
	@EJB
	private ConteudoService beanConteudo;
	private Disciplina disciplina = new Disciplina();
	private Disciplina disciplinaSelecionada;
	private int id;
	private Concurso concursoSelecionado = new Concurso();
	private List<Concurso> listaConcurso = new ArrayList<Concurso>();
	private int idBusca, idExclusao;
	private List<Disciplina> listaDisciplinas = new ArrayList<Disciplina>();
	private List<Conteudo> listaConteudos = new ArrayList<Conteudo>();
	private List<Referencia> listaReferencias = new ArrayList<Referencia>();
	private int id_usuario;

	/**
	 * Retorna lista de referências.
	 * 
	 * @return lista de referencias
	 */
	public List<Referencia> getListaReferencias() {
		return listaReferencias;
	}

	/**
	 * Seta lista de referências.
	 * 
	 * @param listaReferencias
	 *            lista de referencias
	 */
	public void setListaReferencias(List<Referencia> listaReferencias) {
		this.listaReferencias = listaReferencias;
	}

	/**
	 * Construtor padrão. Pega o objeto usuário que está na sessão, para usar
	 * quando for necessário.
	 */
	public CadastrarDisciplinaMB() {
		Usuario usuario;
		Object user = (Usuario) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("usuario");

		usuario = (Usuario) user;
		this.id_usuario = usuario.getId();
	}

	/**
	 * Rediciona para a página de inserir disciplina, enviando o objeto
	 * Discipina.
	 * 
	 * @param disciplina
	 *            Disciplina
	 * @throws IOException
	 */
	public void inserirConteudo(Disciplina disciplina) throws IOException {
		this.disciplinaSelecionada = new Disciplina();
		this.disciplinaSelecionada = disciplina;
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("inserirDisciplina.xhtml");
	}

	/**
	 * Retorna lista de conteúdos.
	 * 
	 * @return
	 */
	public List<Conteudo> getListaConteudos() {
		this.listaConteudos = this.beanConteudo
				.buscarPorDisciplina(this.disciplinaSelecionada.getId());
		return this.listaConteudos;
	}

	/**
	 * Retorna objeto ConteudoEJB.
	 * 
	 * @return ConteudoService ConteudoEJB
	 */
	public ConteudoService getBeanConteudo() {
		return beanConteudo;
	}

	/**
	 * Seta objeto ConteudoEJB.
	 * 
	 * @param beanConteudo
	 *            conteudoEJB
	 */
	public void setBeanConteudo(ConteudoService beanConteudo) {
		this.beanConteudo = beanConteudo;
	}

	/**
	 * Seta lista de conteudos.
	 * 
	 * @param listaConteudos
	 *            lista de conteudos
	 */
	public void setListaConteudos(List<Conteudo> listaConteudos) {
		this.listaConteudos = listaConteudos;
	}

	/**
	 * Cadastra uma disciplina e salva no banco de dados.
	 */
	public void cadastrarDisciplina() {
		FacesContext context = FacesContext.getCurrentInstance();
		this.disciplina.setConcurso(this.concursoSelecionado);
		this.beanDisciplina.cadastrarDisciplina(disciplina);
		this.disciplina = new Disciplina();
		context.addMessage(null, new FacesMessage("Sucesso",
				"Disciplina cadastrada com sucesso para o concurso "
						+ this.concursoSelecionado.getNome()));
	}

	/**
	 * Retorna uma disciplina.
	 * 
	 * @return disciplina Disciplina
	 */
	public Disciplina getDisciplina() {
		return this.disciplina;
	}

	/**
	 * Seta objeto Disciplina.
	 * 
	 * @param disciplina
	 *            Disciplina
	 */
	public void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}

	/**
	 * Retorna lista de disciplinas.
	 * 
	 * @return lista de disciplinas
	 */
	public List<Disciplina> getDisciplinas() {
		return new ArrayList<Disciplina>(this.beanDisciplina.listarDisciplina(this.id_usuario));
	}

	/**
	 * Retona instancia do objeto DisciplinaEJB.
	 * 
	 * @return disciplinaService DisciplinaEJB
	 */
	public DisciplinaService getBeanDisciplina() {
		return beanDisciplina;
	}

	/**
	 * Seta objeto DisciplinEJB.
	 * 
	 * @param beanDisciplina
	 */
	public void setBeanDisciplina(DisciplinaService beanDisciplina) {
		this.beanDisciplina = beanDisciplina;
	}

	/**
	 * Exclui uma disciplina.
	 */
	public void excluirDisciplina() {
		if (this.disciplinaSelecionada == null)
			System.out.println("a disciplina esta nula");
		else {
			FacesContext context = FacesContext.getCurrentInstance();
			this.beanDisciplina.excluirDisciplina(this.disciplinaSelecionada);
			ELResolver resolver = context.getApplication().getELResolver();
			ConcursoMB concursoMB = (ConcursoMB) resolver.getValue(
					context.getELContext(), null, "concursoMB");
			concursoMB.setListaDisciplinas(this.beanDisciplina
					.buscarPorConcurso(concursoMB.getConcursoSelecionado()
							.getId()));

			context.addMessage(null, new FacesMessage("Sucesso",
					"Disciplina exclu�da com sucesso"));
		}
	}

	/**
	 * Metodo para selecionar uma disciplina, para esta ficar disponível no MB
	 * para outras operações.
	 * 
	 * @param disciplina
	 *            Disciplina
	 */
	public void selecionarDisciplina(Disciplina disciplina) {
		this.disciplinaSelecionada = new Disciplina();
		setDisciplinaSelecionada(disciplina);
	}

	/**
	 * Retorna lista de disciplinas.
	 * 
	 * @return lista de disciplinas
	 */
	public List<Disciplina> listarDisciplinas() {
		this.listaDisciplinas = this.beanDisciplina.listarDisciplina(this.id_usuario);
		return this.listaDisciplinas;
	}

	/**
	 * Atualiza disciplina.
	 */
	public void atualizarDisciplina() {
		this.beanDisciplina.atualizarDisciplina(this.disciplina);
	}

	/**
	 * Busca uma disciplina pelo id.
	 */
	public void buscaPorId() {
		this.disciplina = this.beanDisciplina.buscaPorId(idBusca);
	}

	public int getIdBusca() {
		return this.idBusca;
	}

	public void setIdBusca(int idBusca) {
		this.idBusca = idBusca;
	}

	public int getIdExclusao() {
		return this.idExclusao;
	}

	public void setIdExclusao(int idExclusao) {
		this.idExclusao = idExclusao;
	}

	/**
	 * Retorna lista de disciplinas.
	 * 
	 * @return lista de disciplinas
	 */
	public List<Disciplina> getListaDisciplina() {
		return this.listaDisciplinas;
	}

	/**
	 * Seta lista de disciplinas
	 * 
	 * @param listaDisciplinas
	 *            lista de disciplinas
	 */
	public void setListaDisciplina(List<Disciplina> listaDisciplinas) {
		this.listaDisciplinas = listaDisciplinas;
	}

	/**
	 * Retorna uma disciplina selecionada.
	 * 
	 * @return disciplinaSelecionada
	 */
	public Disciplina getDisciplinaSelecionada() {
		return disciplinaSelecionada;
	}

	/**
	 * Seta disciplina no objeto disciplinaSelecionada para ficar disponível no
	 * MB.
	 * 
	 * @param disciplinaSelecionada
	 *            disciplina
	 */
	public void setDisciplinaSelecionada(Disciplina disciplinaSelecionada) {
		this.disciplinaSelecionada = disciplinaSelecionada;
	}

	/**
	 * Retona objeto ConcursoEJB.
	 * 
	 * @return concursoService
	 */
	public ConcursoService getBeanConcurso() {
		return beanConcurso;
	}

	/**
	 * Seta objeto ConcursoEJB.
	 * 
	 * @param beanConcurso
	 *            concursoEJB
	 */
	public void setBeanConcurso(ConcursoService beanConcurso) {
		this.beanConcurso = beanConcurso;
	}

	/**
	 * Retorna objeto selecionado.
	 * 
	 * @return concurso
	 */
	public Concurso getConcursoSelecionado() {
		return concursoSelecionado;
	}

	/**
	 * Seta o concurso em um objeto ConcursoSelecionado para ficar disponível
	 * para outras operações.
	 * 
	 * @param concursoSelecionado
	 *            concurso
	 */
	public void setConcursoSelecionado(Concurso concursoSelecionado) {
		this.concursoSelecionado = concursoSelecionado;
	}

	/**
	 * Retona lista de disciplinas.
	 * 
	 * @return lista de disciplinas.
	 */
	public List<Disciplina> getListaDisciplinas() {
		return listaDisciplinas;
	}

	public void setListaDisciplinas(List<Disciplina> listaDisciplinas) {
		this.listaDisciplinas = listaDisciplinas;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Retorna lista de concursos.
	 * 
	 * @returna lista de concursos
	 */
	public List<Concurso> getListaConcurso() {
		return new ArrayList<Concurso>(
				this.beanConcurso.listarConcursos(this.id_usuario));
	}

	/**
	 * Seta lista de concursos.
	 * 
	 * @param listaConcurso
	 *            lista de concursos
	 */
	public void setListaConcurso(List<Concurso> listaConcurso) {
		this.listaConcurso = listaConcurso;
	}

	/**
	 * Se o id for 0, lista todos as diciplinas. Se não, lista as disciplinas
	 * que o id do concurso é igual a este id
	 */
	public void buscarDisciplinaPorConcurso() {
		if (this.id == 0) {
			this.listaDisciplinas = this.beanDisciplina.listarDisciplina(this.id_usuario);
		} else
			this.listaDisciplinas = this.beanDisciplina
					.buscarPorConcurso(this.id);

		try {
			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("listarLembretes.xhtml");
		} catch (IOException exception) {
		}
	}

	/**
	 * Redireciona para a pagina de destalhes da disciplinas.
	 * 
	 * @param disciplina disciplina
	 * @throws IOException
	 */
	public void exibirDetalhesDisciplina(Disciplina disciplina)
			throws IOException {
		setDisciplinaSelecionada(disciplina);
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("detalhesDisciplina.xhtml");
	}

	/**
	 * Redireciona para a página de refências da disciplina.
	 * 
	 * @param disciplina disciplina
	 * @throws IOException
	 */
	public void exibirReferenciasDisciplina(Disciplina disciplina)
			throws IOException {
		setDisciplinaSelecionada(disciplina);
		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("listarReferencias.xhtml");
	}

}
